/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ufpb.halloc.negocio;

import br.com.ufpb.halloc.exceptions.HorarioIndisponivelException;
import br.com.ufpb.halloc.exceptions.HorarioNaoAlocadoException;
import java.io.Serializable;

/**
 *
 * @author leonardo
 */
public class HorarioDisciplina implements Horario, Serializable {
  
    
    /* talvez isso mude, pois depende de como estará salvo no BD. Assim, pode-se
     optar por armazenar apenas uma String representando a matricula, por exemplo! */
    private Professor [][] hprofs;
    
    
    public HorarioDisciplina(){
        hprofs = new Professor [TLINHAS][TCOLUNAS];
    }
    
    /**
     * Este método aloca um horário para a disciplina que possui este objeto,
     * ou seja, no momento da alocação de um horário para uma Turma, o horário
     * da disciplina que possui este objeto deve ser atualizado conforme o
     * Professor alocado a mesma.
     * @exception HorarioIndisponivelException
     * @param 
     * int hora: representa a hora em que a disciplina será ministrada
     * int dia: correspondente ao dia da semana
     * Object obj: objeto representando a informação a ser colocada e exibida
     * sempre que necessário.
     */
    @Override
    public void alocarHorario(int hora, int dia, Object obj) throws HorarioIndisponivelException{
        
        if (hora >= PRIMEIRO && hora <= SEXTO && dia >= SEG && dia <= SEX){
            if (ehLivre(hora, dia)){
                Professor prof = (Professor) obj;
                hprofs[hora][dia] = prof;
            } else {
                throw new HorarioIndisponivelException("Esse horário já está ocupado. Verifique o horário e tente novamente");
            }
        }
    }
    
    /* ainda falta verificar se existe a necessidade de tratar exceções */
    @Override
    public void removerHorario(int hora, int dia, Object obj) throws HorarioNaoAlocadoException {
        if (hora >= PRIMEIRO && hora <= SEXTO && dia >= SEG && dia <= SEX){
            if (!ehLivre(hora, dia)){
                hprofs[hora][dia] = null;
            } else {
                throw new HorarioNaoAlocadoException("Preste atenção! Pois este horário não está alocado!!!");
            }
        }
    }
    
    /* ainda falta verificar se existe a necessidade de tratar exceções */
    @Override
    public boolean ehLivre(int hora, int dia){
        if (hora >= PRIMEIRO && hora <= SEXTO && dia >= SEG && dia <= SEX){
            if (hprofs[hora][dia] == null){
                return true;
            }
        }
        return false;
    }
    
    /* para recuperar o objeto de retorno é necessário fazer uma downcast! */
    @Override
    public Object getAlocado(int hora, int dia) throws HorarioNaoAlocadoException{
        if (!ehLivre(hora, dia))
            return (Object) hprofs[hora][dia]; /* upcast para Object */
        throw new HorarioNaoAlocadoException("Preste atenção! Pois este horário não está alocado!!!");
    }
    
        
}
